/*#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LONG_CHAINE_MOTS 512
#define PROFONDEUR_PILE_MOTS 128
#define PROFONDEUR_PILE_EVALUATION 128
char *pile_mots[PROFONDEUR_PILE_MOTS];
int pile_mots_index_haut;
char *pile_evaluation[PROFONDEUR_PILE_EVALUATION];
int pile_evaluation_index;
int pile_nombres[PROFONDEUR_PILE_EVALUATION];
int pile_nombres_index;
int empile_mot(char *mot);
char *depile_mot_haut();
char *depile_mot(int pile_index);
int evalue_pile(void);
int evaluation_pile;
*/

#include <../includes/pile.h>
#include <../includes/dict.h>

int pile(void)
{
	int m, i, copie_pile_mots_index, eval;
	char car, *mots, *mots_dup, *mot;
	mots=(char*)malloc(sizeof(char)*LONG_CHAINE_MOTS);

	i=0;
	printf(">");
	while( (car = getchar()) != '\n' )
	{
		*(mots+i) = car;
		i++;
		if ( i >= (LONG_CHAINE_MOTS-1) ) break;
	}
	*(mots+i) = '\0';

	 //printf("MOTS=%s\n", mots);

	 mots_dup = strdup(mots); // strdup fait l'allocation memoire -> faut libere apres !!!
	 m=1;
	 pile_mots_index_haut = 0;

	 while( (mot=strtok(mots_dup, " ")) != NULL  )
	 {
		 //printf("MOTÂ #%d = %s\n", m, mot);
		 mots_dup = NULL;
         m++;
         empile_mot(mot);
	 }
	 // depile par le haut
	 copie_pile_mots_index = pile_mots_index_haut;
/*
	 while( pile_mots_index_haut > 0)
		 printf("MOT DEPILE = %s\n", depile_mot_haut());
	 pile_mots_index_haut = copie_pile_mots_index;

	 printf("\n");

	 // depile par la bas
	 copie_pile_mots_index = pile_mots_index_haut;
	 i=0;
	 while( i < pile_mots_index_haut)
		 printf("MOT DEPILE = %s\n",  depile_mot(i++));
*/
	 pile_mots_index_haut = copie_pile_mots_index;

	 eval = evalue_pile();
	 if ( eval == -1 ) printf("STACK UNDERFLOW !\n");
	 if ( eval == 1 ) printf("STACK OVERFLOW !\n");
	 printf("EVALUATION PILE = %d\n", evaluation_pile);

return 0;
}

int evalue_pile(void)
{
 char *mot;
 int nombre, i, resultat_operation;
 i=0;
 pile_nombres_index = 0;

   while( i < pile_mots_index_haut )
   {
	   mot = depile_mot(i++);
	   if ( strlen(mot) == 1 )
	   {
		   switch( *mot )
		   {
		    case '0' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '1' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '2' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '3' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '4' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '5' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '6' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '7' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '8' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '9' : nombre = atoi(mot); pile_nombres[pile_nombres_index++] = nombre; break;
		    case '+' : nombre = atoi(mot);
		               //printf("PLUS\n");
		    		   if ( pile_nombres_index > 1)
		    		   {
		    			   resultat_operation = pile_nombres[pile_nombres_index-2] + pile_nombres[pile_nombres_index-1];
		    			   pile_nombres_index -= 2;
		    			   pile_nombres[pile_nombres_index++] = resultat_operation;
		    			   //printf("RESULTAT = %d\n", resultat_operation);
		    		   }
		    		   else return -1; // printf("Stack underflow !\n");
		               break;
		    case '-' : //printf("MOINS\n");
		    			if ( pile_nombres_index > 1)
		    			{
		    				resultat_operation = pile_nombres[pile_nombres_index-2] - pile_nombres[pile_nombres_index-1];
			    			pile_nombres_index -= 2 ;
			    			pile_nombres[pile_nombres_index++] = resultat_operation;
		    				//printf("RESULTAT = %d\n", resultat_operation);
		    			}
		    			else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '*' : //printf("MULT\n");
						if ( pile_nombres_index > 1)
						{
							resultat_operation = pile_nombres[pile_nombres_index-2] * pile_nombres[pile_nombres_index-1];
							pile_nombres_index -= 2 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '/' :  // printf("DIV\n");
						if ( pile_nombres_index > 1)
						{
							resultat_operation = pile_nombres[pile_nombres_index-2] / pile_nombres[pile_nombres_index-1];
							pile_nombres_index -= 2 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '%' : //printf("MODULO\n");
						if ( pile_nombres_index > 1)
						{
							resultat_operation = pile_nombres[pile_nombres_index-2] % pile_nombres[pile_nombres_index-1];
							pile_nombres_index -= 2 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '&' : //printf("LOGIC AND\n");
						if ( pile_nombres_index > 1)
						{
							resultat_operation = pile_nombres[pile_nombres_index-2] & pile_nombres[pile_nombres_index-1];
							pile_nombres_index -= 2 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '|' : //printf("LOGIC |\n");
						if ( pile_nombres_index > 1)
						{
							resultat_operation = pile_nombres[pile_nombres_index-2] | pile_nombres[pile_nombres_index-1];
							pile_nombres_index -= 2 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '!' : //printf("LOGIC !\n");
						if ( pile_nombres_index >= 1 )
						{
							resultat_operation = (! pile_nombres[pile_nombres_index-1]);
							pile_nombres_index -= 1 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
		    			break;
		    case '~' : //printf("TILTE\n");
						if ( pile_nombres_index >= 1 )
						{
							resultat_operation = (~pile_nombres[pile_nombres_index-1]);
							pile_nombres_index -= 1 ;
							pile_nombres[pile_nombres_index++] = resultat_operation;
							//printf("RESULTAT = %d\n", resultat_operation);
						}
						else return -1; // printf("Stack underflow !\n");
						break;
		    case '?' :  printf("INTERROGATION\n");
						break;
		   }
		   continue;
	   }
	   if ( strlen(mot) > 1)
	   {
		   // nombre ?   RESTE LE CAS DE +0 et -0 A  TRAITER
		   nombre = atoi(mot); // tente conversion
		   if ( nombre == 0 ) // conversion donne zero -> douteux, probablement pas un nombre
		   {
			   if  (  (*(mot+0) < '0' && *(mot+0) > '9') || (*(mot+0) != '+') || (*(mot+0) != '-')  ) // premier
			   {
				   printf("%s -> CHAINE\n", mot);
				   // dernier car = '?'
				   if ( *(mot+strlen(mot)-1) == '?' )
					  printf("question\n");
				   dict(mot);
			   }
			   else
			   {
				   printf("%s -> c'est bien un NOMBRE=%d\n", mot, nombre);
				   pile_nombres[pile_nombres_index++] = nombre;
			   }
		   }
		   else
		   {
			   //printf("%s ->NOMBRE=%d\n", mot, nombre);
			   pile_nombres[pile_nombres_index++] = nombre;
		   }
	   }
	 if ( pile_nombres_index > PROFONDEUR_PILE_EVALUATION )
	 {
		 printf("Evaluation Stack Overflow !\n");
		return +1;
	 }
   }
  evaluation_pile = resultat_operation;
 return 0;
}

int empile_mot(char *mot)
{
	pile_mots[pile_mots_index_haut] = (char*)malloc(strlen(mot)+1);
	strcpy(pile_mots[pile_mots_index_haut], mot);
	pile_mots_index_haut++;
	if ( pile_mots_index_haut >= PROFONDEUR_PILE_MOTS ) pile_mots_index_haut = 0;
 return 0;
}
char *depile_mot_haut()
{
	pile_mots_index_haut--;
	return pile_mots[pile_mots_index_haut];
}
char *depile_mot(pile_index)
{
	return pile_mots[pile_index];
}



